iT邦幫忙

2024 iThome 鐵人賽

DAY 30
0
自我挑戰組

初學者學習到的JavaScript 知識系列 第 30

鐵人賽DAY30-leetcode練習(四)

  • 分享至 

  • xImage
  •  

LeetCode第6題是「Z字形變換」(Zigzag Conversion)。這題目要求將給定的字符串按照特定的Z字形排列,然後按行讀取返回最終的結果。
題目描述
將字符串 "PAYPALISHIRING" 以 Z 字形排列成給定的行數(numRows),例如當 numRows = 3 時,排列如下:
P A H N
A P L S I I G
Y I R
然後逐行讀取,輸出 "PAHNAPLSIIGYIR"。

解題想法
1.如果numRows為1,那麼不需要任何變換,直接返回原字符串。
2.創建一個數組,數組的每個元素對應每一行。
3.從上往下逐行將字符放入數組中,當到達最後一行後,反方向從下往上移動,並重複這個過程。
4.將所有行連接起來形成最終結果。

public class Solution {
    public String convert(String s, int numRows) {
        if (numRows == 1 || s.length() <= numRows) {
            return s;
        }
        // 創建 numRows 個 StringBuilder 對應每一行
        List<StringBuilder> rows = new ArrayList<>();
        for (int i = 0; i < Math.min(numRows, s.length()); i++) {
            rows.add(new StringBuilder());
        }
        int curRow = 0;
        boolean goingDown = false;

        //將字符逐個加入對應的行
        for (char c : s.toCharArray()) {
            rows.get(curRow).append(c);
            // 如果到了第一行或最後一行,改變方向
            if (curRow == 0 || curRow == numRows - 1) {
                goingDown = !goingDown;
            }
            //根據方向更新當前行數
            curRow += goingDown ? 1 : -1;
        }
        //將所有行的結果合併成一個字符串
        StringBuilder result = new StringBuilder();
        for (StringBuilder row : rows) {
            result.append(row);
        }
        return result.toString();
        }
    }

                                                        
                                                        
                                                        
                                                        
                          

上一篇
鐵人賽DAY29-leetcode練習(三)
系列文
初學者學習到的JavaScript 知識30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言